
#include <stdio.h>


/* 大端存储方式：数据的低位存储到内存的高地址中，数据的高位存储到内存的低地址中
 * 小端存储方式：数据的低位存储到内存的低地址中，数据的高位存储到内存的高地址中
 * 
 * c语言两种方式判断系统的大小端：强制类型转换和联合体的存储特点
 * 字节序：高位字节--->低位字节 0x223344,从左到右，由高位字节到低位字节 因此bit的顺序是从右到左递增的 bit9 bit8 bit7 bit7 bit5 bit4 bit3 bit2 bit1 bit0
 * 地址: 低地址--->高地址 
*/

/* 联合体类似与结构体，都是不同元素的集合，但是联合体的成员共用一块内存空间，因此在一定程度上可以节约空间
 * 联合体的大小一般是其最大成员的大小，但是会有字节对齐的整数倍
 * 对联合体的一个成员的修改会导致另一个成员的改变，通过这个特性，可以用其来判断系统的大小端
*/

union un_big_little_endian
{
    int a;
    char b;
};


int is_byteorder(int *p)
{
    return  *((char *)p);
}

int is_byteorder_unin(int *p)
{

    union un_big_little_endian temp;
    temp.a = *p;
    return  temp.b;
}


int main(int argc, char *argv[])
{

    int n = 1; // 0x00000001

    n = is_byteorder_unin(&n);

    if (n==1)
    {
        printf("小端\n");
    }
    else
    {
        printf("大端\n");
    }


}